/**
 * Classe chargée de la génération du code en rapport avec les boucles itérations
 * 
 * @author BlobbyCompiloTeam
 *
 */

import java.util.Stack;


public class GenerationIteration implements GramConstants{
	
	private static MaP map; // Référence vers la machine à pile pour l'écriture du code
	private int maxIter; // Permet de garder en mémoire le plus grand numéro d'itération attribué
	private Stack<Integer> pileIter; // Pile permettant de garder l'historique d'ouverture des boucles pour attribuer le bon numéro d'étiquette pour la fermeture des boucles
	
	/**
	 * Le constructeur de la classe GenerationIteration
	 * @param _map Référence vers la machine à pile
	 */
	public GenerationIteration(MaP _map) {
		map = _map;
		maxIter = 1;
		pileIter = new Stack<Integer>();
	}
	
	/**
	 * Génère le code d'ouverture d'une itération TantQue. Incrémente et empile le numéro d'étiquette.
	 */
	public void iter_ttq() {
		map.iter_ttq(maxIter);
		pileIter.push(maxIter);
		maxIter++;
	}
	
	/**
	 * Génère le code lors de la rencontre du mot clé Faire.
	 */
	public void iter_faire() {
		map.iter_faire(pileIter.peek());
	}
	
	/**
	 * Génère le code de fermeture d'une boucle TantQue. Dépile le numéro d'étiquette correspondant.
	 */
	public void iter_fait() {
		map.iter_fait(pileIter.pop());
	}
	
	/**
	 * Vérifie que le type de la condition de la boucle est bien booléen. Affiche une erreur le cas échéant.
	 * @param type la constante de type de la condition
	 */
	public void iter_exprBool(int type) {
		if(type != typeBool) {
			System.out.println("Erreur : GenerationIteration.iter_exprBool");
		}
	}
	
}
